package com.example.springdemo.design_model.singleton;

/**
 * 单例模式
 * @author zhangding
 * @date 2022年3月23日09:16:56
 */

/**
 * 饿汉式（静态常量）
 */
class Singleton {
    /**
     * 私有化构造器，防止直接new对象
     */
    private Singleton(){}

    /**
     * 直接创建静态成员变量
     */
    private final static Singleton instance = new Singleton();

    /**
     * 提供方法供外界访问
     * @return instance
     */
    public static Singleton getInstance(){
        return instance;
    }
}
/**
 * 饿汉式（静态代码块）
 */
class Singleton2 {
    /**
     * 私有化构造器，防止直接new对象
     */
    private Singleton2(){}

    /**
     * 静态代码块初始化实例
     */
    private static Singleton2 instance;
    static {
        Singleton2 instance = new Singleton2();
    }

    /**
     * 提供方法供外界访问
     * @return instance
     */
    public static Singleton2 getInstance(){
        return instance;
    }
}

/**
 * 懒汉式（线程不安全）
 */
class Singleton3{
    /**
     * 创建成员变量实例
     */
    private static Singleton3 instance;

    /**
     * 私有化构造方法防止new对象
     */
    private Singleton3(){}

    /**
     * 调用getInstance方法时再去创建对象
     * @return
     */
    public static Singleton3 getInstance(){
        instance = new Singleton3();
        return instance;
    }
}
/**
 * 懒汉式（线程安全）
 */
class Singleton4{
    /**
     * 创建成员变量实例
     */
    private static Singleton4 instance;

    /**
     * 私有化构造方法防止new对象
     */
    private Singleton4(){}

    /**
     * 调用getInstance方法时再去创建对象,使用同步方法
     * @return
     */
    public static synchronized Singleton4 getInstance(){
        if (instance == null){
            instance = new Singleton4();
        }
        return instance;
    }
}
/**
 * 懒汉式（双重检查）
 */
class Singleton5{
    /**
     * 创建成员变量实例
     */
    private static Singleton5 instance;

    /**
     * 私有化构造方法防止new对象
     */
    private Singleton5(){}

    /**
     * 调用getInstance方法时再去创建对象,双重检查
     * @return
     */
    public static  Singleton5 getInstance(){
        if (instance == null){
            synchronized (Singleton5.class){
                if (instance == null){
                    instance = new Singleton5();
                }
            }
        }
        return instance;
    }
}
/**
 * 静态内部类
 */
class Singleton6{
    /**
     * 私有化构造方法防止new对象
     */
    private Singleton6(){}

    /**
     * 静态内部类初始化实例
     */
    public static class SingletonInstance{
        private static final Singleton6 instance = new Singleton6();
    }
    /**
     * 调用getInstance方法时再去创建对象，返回实例
     * @return
     */
    public static synchronized Singleton6 getInstance(){
        return SingletonInstance.instance;
    }
}
/**
 * 枚举
 */
enum Singleton7{
    INSTANCE;
    public void test(){
        System.out.println("888");
    }

    public static void main(String[] args) {
        Singleton7 instance = Singleton7.INSTANCE;
        instance.test();
    }
}
